//package com.java.base.exercise.algorithm.implHas;
//
//
//import java.util.*;
//
///**
// * 实现一致Hash算法
// * 主要用于解决因节点动态变化导致的数据迁移问题，例如在分布式缓存、负载均衡、P2P网络等场景中应用广泛。
// * 1将所有节点映射到一个虚拟的哈希环上。
// * 2对于每个实际节点，可以添加多个虚拟节点，以提高分布的均匀性。
// * 3计算数据项的哈希值，并找到环上的下一个节点。
// */
//public class ConsistentHash {
//    private final Map<Long, String> circle = new TreeMap<>();
//    private final Map<String, List<Long>> replicas = new HashMap<>();
//
//    public static void main(String[] args) {
//        ConsistentHash consistentHash = new ConsistentHash();
//        consistentHash.initNodes(Arrays.asList("Node1", "Node2", "Node3"), 100);
//        System.out.println(consistentHash.getNode("key1"));
//        System.out.println(consistentHash.getNode("key2"));
//        System.out.println(consistentHash.getNode("key3"));
//    }
//
//    public void initNodes(List<String> nodes, int numberOfReplicas) {
//        for (String node : nodes) {
//            List<Long> replicasForNode = new ArrayList<>();
//            for (int i = 0; i < numberOfReplicas; i++) {
//                long hash = getFNV1_64(node + "#" + i);
//                circle.put(hash, node);
//                replicasForNode.add(hash);
//            }
//            replicas.put(node, replicasForNode);
//        }
//    }
//
//    public String getNode(String key) {
//        if (circle.isEmpty()) {
//            return null;
//        }
//
//        long hash = getFNV1_64(key);
//        // Get the upper entry in the sorted map or the first entry if not found
//        Map.Entry<Long, String> entry = circle.ceilingEntry(hash);
//        if (entry == null) {
//            entry = circle.firstEntry();
//        }
//        return entry.getValue();
//    }
//
//    private long getFNV1_64(String key) {
//        long hash = 14695981039346656037L;
//        for (char c : key.toCharArray()) {
//            hash ^= c;
//            hash *= 1099511628211L;
//        }
//        return hash;
//    }
//
//
//
//}
